package org.springblade.modules.admin.task.feishu;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.enums.FeiShuDocumentEnum;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.admin.dto.feishu.*;
import org.springblade.modules.admin.service.ElevatorService;
import org.springblade.modules.admin.service.feishu.IFeiShuDocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 银河排期数据跟踪
 *
 * @author Sharry
 * @since 2024-01-03
 */
@Component
@Slf4j
public class GalaxyElevatorTrackJob {

	@Autowired
	private IFeiShuDocumentService feiShuDocumentService;

	@Autowired
	private ElevatorService elevatorService;

	/**
	 * 定时任务：每天 2 点 10 分执行一次
	 * 测试更新银河维保排期
	 */
	@XxlJob("testUpdateTrack")
	public void testUpdateTrack() {
		XxlJobHelper.handleSuccess("飞书银河排期表副本-[执行]开始");
		try {
			// 0. 数据校验、数据准备：目标文件夹Token、文档ID、获取银河租户的电梯排期信息
			// 目标文件夹Token
			String appToken = FeiShuDocumentEnum.GALAXY_ELEVATOR_TRACK_COPY.getAppToken();
			String tableId = FeiShuDocumentEnum.GALAXY_ELEVATOR_TRACK_COPY.getTableId();
			// 发送消息
			String result = "";
			// 获取银河租户的电梯排期信息
			List<GalaxyElevatorTrackUpdateDTO> galaxyUpdateDTOList = elevatorService.getGalaxyElevatorTrackUpdateDTO();
			// 遍历数据,补全信息
			galaxyUpdateDTOList.forEach(g -> {
				g.setCreateTimeLong(new Date().getTime());
				// switch case 语句, maintainStatus -1:无状态，1: 脱保，2: 在保（合同期内），3：在保（合同期外），4：在保（拟定保养）
				int maintainStatus = g.getMaintainStatus();
				switch (maintainStatus) {
					case -1:
						g.setInServiceStatus("无状态");
						break;
					case 1:
						g.setInServiceStatus("脱保");
						break;
					case 2:
						g.setInServiceStatus("在保（合同期内）");
						break;
					case 3:
						g.setInServiceStatus("在保（合同期外）");
						break;
					case 4:
						g.setInServiceStatus("在保（拟定保养）");
						break;
					default:
						g.setInServiceStatus("数据缺失");
						break;
				}
				g.setOutsourcingStatus(new Integer("1").equals(g.getFromType()) ? "外包" : "非外包");
				if (Func.isNull(g.getElevatorId())) {
					g.setHasRemainingSchedule("无");
				} else {
					g.setHasRemainingSchedule("有");
				}
				g.setElevatorAnnualType(new Integer("0").equals(g.getUseType()) ? "年审" : "非年审");
			});
			// 数据封装
			FeiShuBatchDTO batchDTO = new FeiShuBatchDTO();
			List<FeiShuFieldsDTO> records = new ArrayList<>();
			for (GalaxyElevatorTrackUpdateDTO u : galaxyUpdateDTOList) {
				FeiShuFieldsDTO element = new FeiShuFieldsDTO();
				Map<String, Object> elementMap = new HashMap<>(10);
				elementMap.put("项目名称", u.getBuildingName());
				elementMap.put("梯号", u.getElevatorNumber());
				elementMap.put("电梯年审类型", u.getElevatorAnnualType());
				elementMap.put("在保状态", u.getInServiceStatus());
				elementMap.put("外包情况", u.getOutsourcingStatus());
				elementMap.put("使用单位", u.getUsageUnit());
				elementMap.put("有无剩余排期", u.getHasRemainingSchedule());
				elementMap.put("创建时间", u.getCreateTimeLong());
				element.setFields(elementMap);
				records.add(element);
			}
			// records 去重
			Set<FeiShuFieldsDTO> set = new HashSet<>(records);
			// 清空 records, 将 set 中的数据添加到 records 中
			records.clear();
			records.addAll(set);
			batchDTO.setRecords(records);
			// 1. 先批量删除文档中的所有数据
			List<JSONObject> jsonObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
			// 获取查询列表的 所有 record_id
			List<String> r = new ArrayList<>();
			jsonObjects.forEach(j -> r.add(j.getString("record_id")));
			FeiShuBatchDTO deletedBatchDTO = new FeiShuBatchDTO();
			deletedBatchDTO.setRecords(r);
			feiShuDocumentService.commandDeleteBatchLimit(appToken, tableId, deletedBatchDTO);
			// 2. 批量添加数据
			result = feiShuDocumentService.commandAddBatchLimit(appToken, tableId, batchDTO);
			// 3. 发送消息通知
			List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
			List<String> chatIds = new ArrayList<>();
			targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
			// 发送消息
			String finalResult = result;
			chatIds.forEach(c -> {
				// 组装数据
				JSONObject bodyJson = new JSONObject();
				bodyJson.put("receive_id", c);
				bodyJson.put("msg_type", "text");
				HashMap<String, String> contentMap = new HashMap<>(2);
				String message = "更新"+ FeiShuDocumentEnum.getDescription(appToken,tableId) +"，结果：" + finalResult;
				contentMap.put("text", message);
				// 将 contentMap 转换成 JSON 格式
				bodyJson.put("content", JSON.toJSONString(contentMap));
				feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
			});
			XxlJobHelper.handleSuccess("飞书银河排期表副本-[执行]成功");
		} catch (Exception e) {
			XxlJobHelper.handleFail("飞书银河排期表副本-[执行]失败" + e);
		}
	}

	/**
	 * 定时任务：每天 2 点 20 分执行一次
	 * 更新银河维保排期
	 */
	@XxlJob("updateTrack")
	public void updateTrack(){
		XxlJobHelper.handleSuccess("飞书银河排期表-[执行]开始");
		try {
			// 0. 数据校验、数据准备：目标文件夹Token、文档ID、获取银河租户的电梯排期信息
			// 目标文件夹Token
			String appToken = FeiShuDocumentEnum.GALAXY_ELEVATOR_TRACK.getAppToken();
			String tableId = FeiShuDocumentEnum.GALAXY_ELEVATOR_TRACK.getTableId();
			// 发送消息
			String result = "";
			// 获取银河租户的电梯排期信息
			List<GalaxyElevatorTrackUpdateDTO> galaxyUpdateDTOList = elevatorService.getGalaxyElevatorTrackUpdateDTO();
			// 遍历数据,补全信息
			galaxyUpdateDTOList.forEach(g -> {
				g.setCreateTimeLong(new Date().getTime());
				// switch case 语句, maintainStatus -1:无状态，1: 脱保，2: 在保（合同期内），3：在保（合同期外），4：在保（拟定保养）
				int maintainStatus = g.getMaintainStatus();
				switch (maintainStatus) {
					case -1:
						g.setInServiceStatus("无状态");
						break;
					case 1:
						g.setInServiceStatus("脱保");
						break;
					case 2:
						g.setInServiceStatus("在保（合同期内）");
						break;
					case 3:
						g.setInServiceStatus("在保（合同期外）");
						break;
					case 4:
						g.setInServiceStatus("在保（拟定保养）");
						break;
					default:
						g.setInServiceStatus("数据缺失");
						break;
				}
				g.setOutsourcingStatus(new Integer("1").equals(g.getFromType()) ? "外包" : "非外包");
				if (Func.isNull(g.getElevatorId())) {
					g.setHasRemainingSchedule("无");
				} else {
					g.setHasRemainingSchedule("有");
				}
				g.setElevatorAnnualType(new Integer("0").equals(g.getUseType()) ? "年审" : "非年审");
			});
			// 数据封装
			FeiShuBatchDTO batchDTO = new FeiShuBatchDTO();
			List<FeiShuFieldsDTO> records = new ArrayList<>();
			for (GalaxyElevatorTrackUpdateDTO u : galaxyUpdateDTOList) {
				FeiShuFieldsDTO element = new FeiShuFieldsDTO();
				Map<String, Object> elementMap = new HashMap<>(10);
				elementMap.put("项目名称", u.getBuildingName());
				elementMap.put("梯号", u.getElevatorNumber());
				elementMap.put("电梯年审类型", u.getElevatorAnnualType());
				elementMap.put("在保状态", u.getInServiceStatus());
				elementMap.put("外包情况", u.getOutsourcingStatus());
				elementMap.put("使用单位", u.getUsageUnit());
				elementMap.put("有无剩余排期", u.getHasRemainingSchedule());
				elementMap.put("创建时间", u.getCreateTimeLong());
				element.setFields(elementMap);
				records.add(element);
			}
			// records 去重
			Set<FeiShuFieldsDTO> set = new HashSet<>(records);
			// 清空 records, 将 set 中的数据添加到 records 中
			records.clear();
			records.addAll(set);
			batchDTO.setRecords(records);
			// 1. 先批量删除文档中的所有数据
			List<JSONObject> jsonObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
			// 获取查询列表的 所有 record_id
			List<String> r = new ArrayList<>();
			jsonObjects.forEach(j -> r.add(j.getString("record_id")));
			FeiShuBatchDTO deletedBatchDTO = new FeiShuBatchDTO();
			deletedBatchDTO.setRecords(r);
			feiShuDocumentService.commandDeleteBatchLimit(appToken, tableId, deletedBatchDTO);
			// 2. 批量添加数据
			result = feiShuDocumentService.commandAddBatchLimit(appToken, tableId, batchDTO);
			// 3. 发送消息通知
			List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
			List<String> chatIds = new ArrayList<>();
			targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
			// 发送消息
			String finalResult = result;
			chatIds.forEach(c -> {
				// 组装数据
				JSONObject bodyJson = new JSONObject();
				bodyJson.put("receive_id", c);
				bodyJson.put("msg_type", "text");
				HashMap<String, String> contentMap = new HashMap<>(2);
				String message = "定时任务更新银河排期数据跟踪表格正本信息，结果：" + finalResult;
				contentMap.put("text", message);
				// 将 contentMap 转换成 JSON 格式
				bodyJson.put("content", JSON.toJSONString(contentMap));
				feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
			});
			XxlJobHelper.handleSuccess("飞书银河排期表-[执行]成功");
		} catch (Exception e) {
			XxlJobHelper.handleFail("飞书银河排期表-[执行]失败" + e);
		}
	}


	private static FeiShuFieldsDTO getFeiShuFieldsDTO(GalaxyElevatorTrackUpdateDTO u) {
		FeiShuFieldsDTO element = new FeiShuFieldsDTO();
		Map<String, Object> elementMap = new HashMap<>(10);
		elementMap.put("项目名称", u.getBuildingName());
		elementMap.put("梯号", u.getElevatorNumber());
		elementMap.put("电梯年审类型", u.getElevatorAnnualType());
		elementMap.put("在保状态", u.getInServiceStatus());
		elementMap.put("外包情况", u.getOutsourcingStatus());
		elementMap.put("使用单位", u.getUsageUnit());
		elementMap.put("有无剩余排期", u.getHasRemainingSchedule());
		elementMap.put("创建时间", u.getCreateTimeLong());
		element.setFields(elementMap);
		return element;
	}
}
